package atech.ace.mapping;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.transaction.SystemException;
import javax.transaction.UserTransaction;

import atech.ace.mapping.persistence.entities.Company;
import atech.ace.mapping.persistence.entities.HumanResource;
import atech.ace.mapping.persistence.entities.Project;

/**
 * Servlet implementation class UpdateProject
 */
@WebServlet("/UpdateProject")
public class UpdateProject extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	@PersistenceContext(name = "jdbc/ACE_ProjectMapping")
	EntityManager em;

	@Resource
	UserTransaction utx;
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String id = request.getParameter("id");
		String name = request.getParameter("projectName");
		String longitudeString = request.getParameter("lng");
		String latitudeString = request.getParameter("lat");
		String location = request.getParameter("location");
		System.out.println(location);
		
		boolean error = false;
		String[] errs = new String[0];
		try {
			utx.begin();
			Project project = em.find(Project.class, id);

			Company company = em.find(Company.class, request.getParameter("company"));
			String[] resources = request.getParameterValues("humanResources");
			
			project.setProjectName(name);
			project.setLocation(location);
			project.setLatitude(Double.parseDouble(latitudeString));
			project.setLongitude(Double.parseDouble(longitudeString));
			project.setCompany(company);
			ArrayList<HumanResource> realResources = new ArrayList<HumanResource>();
			if(resources != null)
			{
				for (String resourceID : resources) {
					HumanResource resource = em.find(HumanResource.class, resourceID);
					List<Project> resourceProjects = resource.getProjects();
					resourceProjects.add(project);
					realResources.add( resource);
					em.merge(resource);
				}
			}
			project.setHumanResources(realResources);
			errs = Validation.validateProject(project);
			if(errs.length > 0)
				error = true;
			else
				em.merge(project);
			utx.commit();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			try {
				utx.rollback();
			} catch (IllegalStateException e1) {
				e1.printStackTrace();
			} catch (SecurityException e1) {
				e1.printStackTrace();
			} catch (SystemException e1) {
				e1.printStackTrace();
			}
		}
		if(error){
			request.setAttribute("updateErrs", errs);
			request.getRequestDispatcher("Create").forward(request, response);
		}else
			response.sendRedirect("Create");
	}

}
